package com.wc.service.impl;

import com.wc.dao.UserMapper;
import com.wc.pojo.ExcelBean;
import com.wc.pojo.User;
import com.wc.service.ExcelService;
import com.wc.service.UserService;
import com.wc.util.ExcelUtil;
import com.wc.util.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * excel实现类
 */
@Service
public class ExcelServiceImpl implements ExcelService {

    @Autowired
    private UserMapper dao;
    @Autowired
    private UserService service;

    protected static Logger logger = LoggerFactory.getLogger(ExcelServiceImpl.class);

    public String ajaxUploadExcel(MultipartFile file) throws Exception {
        if(file.isEmpty()){
            try {
                throw new Exception("文件不存在！");
            } catch (Exception e) {
                logger.debug(e.getMessage());
            }
        }
        InputStream in =null;
        try {
            in = file.getInputStream();
        } catch (IOException e) {
            logger.debug(e.getMessage());
        }

        List<List<Object>> listob = null;
        try {
            //将文件中的数据转换成一个list集合
            listob = new ExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
        } catch (Exception e) {
            logger.debug(e.getMessage());
        }


        //该处可调用service相应方法进行数据保存到数据库中，现只对数据输出
        for (int i = 0; i < listob.size(); i++) {
            User userExcel = new User();
            /*
                设置值之前可以进行验证哪些字段是不能再添加的
             */
            if (StringUtils.isEmpty(String.valueOf(listob.get(i).get(1))) || StringUtils.isEmpty(String.valueOf(listob.get(i).get(0))) || StringUtils.isEmpty(String.valueOf(listob.get(i).get(3)))){
                throw new Exception("基本信息不能为空");
            }
            if (service.validateUseridcard(String.valueOf(listob.get(i).get(1)))){
                throw new Exception("身份证号码不能一致");
            }
            userExcel.setName(String.valueOf(listob.get(i).get(0)));     // 表格的第一列   注意数据格式需要对应实体类属性
            userExcel.setIdcard(String.valueOf(listob.get(i).get(1)));   // 表格的第二列
            userExcel.setMobiile(java.lang.String.valueOf(listob.get(i).get(2)));   // 表格的第三列
            userExcel.setAddress(String.valueOf(listob.get(i).get(3)));   // 表格的第四列
            userExcel.setAge(String.valueOf(listob.get(i).get(4)));       // 表格的第五列
            //由于数据库中此字段是datetime，所以要将字符串时间格式：yyyy-MM-dd HH:mm，转为Date类型
            if (!StringUtils.isEmpty(listob.get(i).get(5))) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                userExcel.setBirtday(sdf.parse(String.valueOf(listob.get(i).get(5)))); // 表格的第六列
            }else {
                userExcel.setBirtday(new Date());
            }
            logger.info("读取的对象是："+userExcel);
            //进行数据保存
            dao.saveUser(userExcel);
        }
        logger.info("文件导入成功！");
        return "1";
    }

    public XSSFWorkbook exportExcelInfo() throws Exception {
        List<Map<String,Object>> list = dao.getUsermap();
        List<ExcelBean> excel = new ArrayList<ExcelBean>();
        Map<Integer,List<ExcelBean>> map = new LinkedHashMap<Integer, List<ExcelBean>>();
        /*
            设置标题栏（根据数据库的列名进行设置）
            如果发现某一列没有内容可以自行debug（ExcelUtil.createTableRows)这个方法循环添加值那里的if是否进去然后设置为空了
            多半是map的key没有写对
         */
        excel.add(new ExcelBean("主键","userid",0));
        excel.add(new ExcelBean("用户名","NAME",0));
        excel.add(new ExcelBean("身份证号码","idcard", 0));
        excel.add(new ExcelBean("手机号码","mobiile",0));
        excel.add(new ExcelBean("地址","address",0));
        excel.add(new ExcelBean("出生日期","birtday",0));
        excel.add(new ExcelBean("年龄","age",0));
        map.put(0,excel);
        String sheetName = "用户信息表";
        //调用ExcelUtil方法
        XSSFWorkbook xssfWorkbook = ExcelUtil.createExcelFile(User.class, list, map, sheetName);
        logger.info("文件导出成功");
        return xssfWorkbook;
    }

}
